#! /usr/bin/python3
# -*- coding: UTF-8 -*-

if __name__ == "__main__":
	raise Exception("不支持从这里调用")

__version__ = "1.0"
__all__ = [
	"MouseChshWuziqi",
]


class MouseChshWuziqi:

	def __init__(self):
		self.__data = None
		self.__history = []
		self.__last = None
		self.__result = '-'
		self.__current = 'B'
		self.clean()

	def clean(self):
		self.__data = [
			# A B C D E F G H I J K L M N O
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 01
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 02
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 03
			'.-.-.-+-.-.-.-.-.-.-.-+-.-.-.'.split('-'),  # 04
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 05
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 06
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 07
			'.-.-.-.-.-.-.-+-.-.-.-.-.-.-.'.split('-'),  # 08
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 09
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 10
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 11
			'.-.-.-+-.-.-.-.-.-.-.-+-.-.-.'.split('-'),  # 12
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 13
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 14
			'.-.-.-.-.-.-.-.-.-.-.-.-.-.-.'.split('-'),  # 15
		]
		self.__history = []
		self.__last = None
		self.__result = '-'
		self.__current = 'B'

	def set(self, value=None, *, who='X', col=-1, row=-1):
		if self.__result != '-':
			return
		if value is not None:
			if len(value) != 4:
				return False
			letter = value[0:1]
			if letter == 'W':
				who = 'W'
			elif letter == 'B':
				who = 'B'
			else:
				return False
			letter = value[1:2]
			if letter < 'A' or letter > 'O':
				return False
			col = ord(letter) - 65
			letter = value[2:4]
			if not letter.isdigit():
				return False
			letter = int(letter)
			if letter <= 0 or letter > 15:
				return False
			row = letter - 1
		if who != 'W' and who != 'B':
			return False
		if who != self.__current:
			return False
		if col < 0 or col >= 15:
			return False
		if row < 0 or row >= 15:
			return False
		target = self.__data[row][col]
		if target == '.' or target == '+':
			self.__data[row][col] = who
			current = who + chr(col + 65) + '%02i' % (row + 1)
			self.__history.append(current)
			if who == 'B':
				self.__current = 'W'
			elif who == 'W':
				self.__current = 'B'
			if self.__last:
				self.__data[self.__last[0]][self.__last[1]] = self.__data[self.__last[0]][self.__last[1]].lower()
			self.__last = (row, col, current)
			return True
		else:
			return False

	def output(self):
		result = '..ABCDEFGHIJKLMNO\n'
		idx = 1
		for row in self.__data:
			result += '%02i' % idx
			for item in row:
				result += item
			result += '\n'
			idx += 1
		result += 'Current:' + self.__current
		result += ',Result:' + self.__result
		if self.__last:
			result += ',Last:' + self.__last[2]
		return result

	def check(self):
		if self.__last:
			row = self.__last[0]
			col = self.__last[1]
			five0 = 1
			five1 = 1
			five2 = 1
			cur = str(self.__data[row][col]).upper()

			def _check_in_line(five, x, y, rg):
				for i in rg:
					new_row = row + i * x
					new_col = col + i * y
					if new_col < 0 or new_row < 0 or new_col >= 15 or new_row >= 15:
						break
					letter = str(self.__data[new_row][new_col]).upper()
					if cur == letter:
						five += 1
					else:
						break
				return five

			five0 = _check_in_line(five0, 0, 1, range(1, 5))
			five0 = _check_in_line(five0, 0, 1, range(-1, -5, -1))

			five1 = _check_in_line(five1, 1, 0, range(1, 5))
			five1 = _check_in_line(five1, 1, 0, range(-1, -5, -1))

			five2 = _check_in_line(five2, 1, 1, range(1, 5))
			five2 = _check_in_line(five2, 1, 1, range(-1, -5, -1))

			if five0 >= 5 or five1 >= 5 or five2 >= 5:
				self.__result = cur

	def table(self):
		result = ''
		for row in self.__data:
			for item in row:
				result += item
			result += '-'
		return result

	def current(self):
		return self.__current

	def result(self):
		return self.__result

	def last(self):
		if self.__last:
			return self.__last[2]
		return ''

	def history(self):
		return ','.join(self.__history)
